/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wf3.core.dao;

import acceso.hibernate.AQuery;
import acceso.hibernate.AccesoHibernate;
import acceso.servlet.Conpar;
import acceso.util.Escritor;
import java.util.Date;
import java.util.List;
import org.hibernate.StatelessSession;
import wf.dto.ContenedorDto;
import wf.dto.geo.ConcapDto;
import wf.dto.geo.CongeoDto;
import wf.dto.geo.EntgeoDto;
import wf.dto.geo.ValentDto;
import wf.dto.pfins_tbfrawor;
import wf.dto.pptransaini;
import wf.dto.qbfrawor_id_frawor;
import wf3.core.ManagerQuery;
import wf3.hibernate.WQuery;
import wf3.log.Log;

/**
 *
 * @author romulogalindo
 */
public class GeovolutionDAO extends DAO {

    StatelessSession session = null;
    AQuery query;
    int idsession = 0;

//    StatelessSession session;
//    ManagerQuery query;
//    private Log log = new Log(getClass());
    /**
     * WorkflowDAO: Constructor
     *
     * @param idsession int
     */
    public GeovolutionDAO(int idsession) {
        session = AccesoHibernate.getSessionFactory().openStatelessSession();
        this.idsession = idsession;
        query = new AQuery(this.idsession);
        idDAO = System.currentTimeMillis();
        time = idDAO;
    }

    public int NEW_IDFRAWOR() {
        return 0;
    }

    /**
     * getIdFrawor: Devuelve un nuevo id para gestionar una tansacción.
     *
     * @return long
     */
    public long getIdFrawor() {
        query.setMquery(session.getNamedQuery("frawor2.qbfrawor_id_frawor"));
        query.setString("frawor", "fratra.qbfrawor_id_frawor");
        qbfrawor_id_frawor qbfrawor = (qbfrawor_id_frawor) query.uniqueResult();
        return qbfrawor.getNextval();
    }

    public int NEW_IDTRANSA(String p_ip_remoto, int p_id_sesion, Date p_fe_solini) {
        return 0;
    }

    /**
     * getTransaIni: Devuelve un objeto tipo pptransaini que da inicio al
     * marcada de inicio de una transaccion del workflow
     *
     * @param host String
     * @param fe_solini Date
     * @return pptransaini
     */
//    public pptransaini getTransaIni(String host, Date fe_solini) {
    public int getTransaIni(String host, Date fe_solini) {
        query.setMquery(session.getNamedQuery("frawor2.pptransaini"));
        query.setString("ip_remoto", host);
        query.setInteger("id_session", this.idsession);
        query.setTimestamp("fe_solini", fe_solini);
        return ((pptransaini) query.uniqueResult()).getPptransaini();
    }

    public boolean INNER_SESSION(int p_id_sesion, int p_id_frawor, int p_id_fraant, int p_co_congeo) {
        return true;
    }

    /**
     * joindTransa_IdFrawor: Une el id_frawor, el id_fraant ( id_frawor anterior
     * )
     *
     * @param id_frawor int
     * @param id_fraant int
     * @param co_conten int
     */
    public void joindTransa_IdFrawor(long id_frawor, long id_fraant, int co_conten) {
        query.setMquery(session.getNamedQuery("frawor2.pfins_tbfrawor"));
        query.setInteger("p_id_sesion", this.idsession);
        query.setInteger("p_id_frawor", (int) id_frawor);
        query.setInteger("p_id_fraant", (int) id_fraant);
        query.setInteger("p_co_conten", co_conten);
        query.uniqueResult();
    }

    /**
     * Consigue el DTO del congeo
     *
     * @param p_co_congeo
     */
    public CongeoDto GET_CONGEO(int p_co_congeo) {
        query.setMquery(session.getNamedQuery("frawor2.pgcongeo"));
        query.setInteger("p_co_congeo", p_co_congeo);
        return (CongeoDto) query.uniqueResult();
    }

    /**
     * GET_CONCAP
     *
     * @param p_co_congeo
     */
    public List<ConcapDto> GET_CONCAP(int p_co_congeo) {
        query.setMquery(session.getNamedQuery("frawor2.pgconcap"));
        query.setInteger("p_co_congeo", p_co_congeo);
        return query.list();
    }

    /**
     * GET_ENTGEO
     *
     * @param p_co_congeo
     * @param p_co_concap
     */
    public List<EntgeoDto> GET_ENTGEO(int p_co_congeo, short p_co_concap) {
        query.setMquery(session.getNamedQuery("frawor2.pgentgeo"));
        query.setInteger("p_co_congeo", p_co_congeo);
        query.setShort("p_co_concap", p_co_concap);
        return query.list();
    }

    /**
     * GET_ENTGEO
     *
     * @param p_co_congeo
     * @param p_co_concap
     */
    public List<ValentDto> GET_VALENT(int p_co_entgeo, long p_id_frawor, int p_co_congeo) {
//        query.setMquery(session.getNamedQuery("frawor2.pgentgeo"));
        query.setMquery(session.getNamedQuery("frawor2.pgvalent"));
        query.setInteger("p_co_entgeo", p_co_entgeo);
        query.setLong("p_id_frawor", p_id_frawor);
        query.setInteger("p_co_congeo", p_co_congeo);
        return query.list();
    }

    /**
     * Guarda los parametros conseguidos de la lista
     *
     * @param ls_parameters
     * @param p_id_frawor
     * @param p_co_conten
     */
    public boolean SAVE_PARAMETER(List<Conpar> ls_parameters, long p_id_frawor, int p_co_congeo) {
        if (ls_parameters != null) {
            for (Conpar conpar : ls_parameters) {
                query.setMquery(session.getNamedQuery("frawor2.pfins_tbconpar"));
                query.setLong("p_id_frawor", p_id_frawor);
                query.setInteger("p_co_conten", p_co_congeo);
                query.setShort("p_co_conpar", conpar.getId());
                query.setString("p_va_conpar", conpar.getValor());
                query.uniqueResult();
            }
        }
        return false;
    }

    @Override
    public void CLOSE_SESSION() throws Exception {
        close = true;
        session.close();
        session = null;
        query = null;
        Escritor.escribe_debug("[" + idDAO + "] GeoDAO-> cerrado.");
    }

    @Override
    public long getIdDAO() {
        return idDAO;
    }

    @Override
    public long getTimelife() {
        return time;
    }

    @Override
    public boolean isClosed() {
        return close;
    }
}
